package com.cg.design.graphicdesignpattern.composite;

/**
 * 表示目录条目的抽象类
 *
 * @program: LeetCode->Entry
 * @description: 表示目录条目的抽象类
 * @author: cg
 * @create: 2022-03-25 18:24
 **/
public abstract class Entry {

    /**
     * 表示当前目录条目的上一级文件夹
     */
    protected Entry parent;

    /**
     * 获取条目名字的抽象方法
     *
     * @return
     */
    public abstract String getName();

    /**
     * 获取条目大小的抽象方法
     *
     * @return
     */
    public abstract int getSize();

    /**
     * 加入条目的方法，由子类实现，在Entry类中只是简单地抛出异常而已，当然还有别的实现方式
     *
     * @param entry 目录条目
     * @return
     * @throws FileTreatmentException 文件异常
     */
    public Entry add(Entry entry) throws FileTreatmentException {
        throw new FileTreatmentException();
    }

    /**
     * 用于显示文件夹中的内容的“一览”的方法
     */
    public void printList() {
        printList("");
    }

    /**
     * 用与显示文件夹中的内容的“一览”并加上前缀的抽象方法
     *
     * @param prefix
     */
    public abstract void printList(String prefix);

    /**
     * 获取完整路径
     *
     * @return
     */
    public String getFullName() {
        StringBuffer fullName = new StringBuffer();
        Entry entry = this;
        do {
            fullName.insert(0, "/" + entry.getName());
            entry = entry.parent;
        } while (entry != null);
        return fullName.toString();
    }

    @Override
    public String toString() {
        return getName() + " (" + getSize() + ")";
    }
}
